#include <iostream>
#include <functional>
#include <list>
#include <algorithm>

class A
{
public:
    int i_ = 0;
    void output(int x, int y)
    {
        std::cout << x << " " << y << std::endl;
    }
};

int main(void)
{
    A a;
    std::function<void(int, int)> fr = std::bind(&A::output, &a,
                                                 std::placeholders::_1, std::placeholders::_2);
    fr(1, 2);

    std::function<int &(void)> fr_i = std::bind(&A::i_, &a);
    fr_i() = 123;
    std::cout << a.i_ << std::endl;

    std::list<int> coll = {1, 2, 9, 4};
    using std::placeholders::_1;
    //int count = std::count_if(coll.begin(), coll.end(), std::bind(std::less<int>(), 2, _1));

    //使用组合 bind 函数
    //目标找出集合中大于 5 小于10 的元素个数
    std::bind(std::greater<int>(), std::placeholders::_1, 5);
    std::bind(std::less_equal<int>(), std::placeholders::_1, 10);

    //using std::placeholders::_1;
    auto f = std::bind(std::logical_and<bool>(),
                       std::bind(std::greater<int>(), _1, 5),
                       std::bind(std::less_equal<int>(), _1, 10));

    int count = std::count_if(coll.begin(), coll.end(), f);
    std::cout << count << std::endl;

    return 0;
}

//fr 的类型是 std::function<void(int, int)>。 我们通过使用 std::bind ,将 A 的成员函数 output 的指针和 a 绑定，并转换为一个仿函数放入 fr 中存储
